<?php

/**
 * SmartPHP framework
 *
 * @name SmartPHP framework
 * @package SmartPHP
 * @author 费尔 <admin@smartphp.cn>
 * @version 1.0 Beta
 * @link http://www.smartphp.cn
 * @copyright smartphp.cn
 * @license <a href="http://www.smartphp.cn">smartphp</a>
 */

namespace Base;

/**
 * 语言包
 * @author 费尔
 */
class Lang {

    // 语言数据
    private static $lang = [];

    /**
     * 获取语言定义(不区分大小写)
     * @access public
     * @param string|null   $name 语言变量
     * @param array         $vars 变量替换
     * @return mixed
     */
    public static function get($name = null, $vars = []) {
        $key = strtolower($name);
        $value = self::$lang[$key] ?? $name;
        if (!empty($vars) && is_array($vars)) {
            $value = str_replace(array_keys($vars), $vars, $value);
        }
        return $value;
    }

    /**
     * 返回所有语言
     * @access public
     * @return array
     */
    public static function getAll() {
        return self::$lang;
    }

    /**
     * 设置语言定义(不区分大小写)
     * @access public
     * @param string|array  $name 语言变量
     * @param string        $value 语言值
     * @param string        $range 语言作用域
     * @return mixed
     */
    public static function set($name, $value = null) {
        if (is_array($name)) {
            self::$lang = array_merge(self::$lang, array_change_key_case($name, CASE_LOWER));
        } else {
            return self::$lang[strtolower($name)] = $value;
        }
    }

    /**
     * 获取语言定义(不区分大小写)
     * @access public
     * @param string|null   $name 语言变量
     * @param array         $vars 变量替换
     * @return mixed
     */
    public static function has($name) {
        return isset(self::$lang[strtolower($name)]);
    }

    /**
     * 加载语言定义(不区分大小写)
     * @access public
     * @param string $file 语言文件
     * @return mixed
     */
    public static function load($file) {
        $lang = [];
        foreach ((array) $file as $_file) {
            $_lang = Loader::import($_file, true) ?: [];
            if (!empty($_lang) && is_array($_lang)) {
                self::$lang = array_merge(self::$lang, array_change_key_case($_lang, CASE_LOWER));
            }
        }
        if (!empty($lang)) {
            self::$lang = $lang + self::$lang;
        }
        return self::$lang;
    }

    /**
     * 自动侦测设置获取语言选择
     * @access public
     * @return string
     */
    public static function detect() {
        static $lang = '';
        if ($lang)
            return $lang;
        if (isset($_GET[Config::get('langvar')])) {
            $lang = strtolower($_GET[Config::get('langvar')]);
            Cookie::set(Config::get('langvar'), $lang, 3600);
        } elseif (Cookie::get(Config::get('langvar'))) {
            $lang = strtolower(Cookie::get(Config::get('langvar')));
        } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
            preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
            $lang = strtolower($matches[1]);
            Cookie::set(Config::get('langvar'), $lang, 3600);
        }
        if (!empty(Config::get('langs')) && !in_array($lang, explode(',', Config::get('langs')))) {
            $lang = 'zh-cn';
        }
        return $lang;
    }

}
